package com.jnetwork.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;





import java.util.Date;

import com.jnetwork.exception.DAOExcepcion;
import com.jnetwork.modelo.Idea;
import com.jnetwork.modelo.Usuario;
import com.jnetwork.util.ConexionBD;


public class IdeaDAO extends BaseDAO {

	public Collection<Idea> buscarIdea(String busqueda, String estado)
			throws DAOExcepcion {
		String query = "select i.id, i.titulo, i.descripcion, i.estado, i.archivo, i.fecha, i.key1, i.key2, i.key3, i.key4, i.asesor, u.nombres, u.apellido_paterno, u.apellido_materno  FROM sgi.idea i left join sgi.usuario u on i.usuario_id=u.id where (titulo like ? or descripcion like ? or key1 like ? or key2 like ? or key3 like ? or key4 like ?) and estado like ?";
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + busqueda + "%");
			stmt.setString(2, "%" + busqueda + "%");
			stmt.setString(3, "%" + busqueda + "%");
			stmt.setString(4, "%" + busqueda + "%");
			stmt.setString(5, "%" + busqueda + "%");
			stmt.setString(6, "%" + busqueda + "%");
			stmt.setString(7, "%" + estado + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setId(rs.getInt("i.id"));
				vo.setTitulo(rs.getString("i.titulo"));
				vo.setDescripcion(rs.getString("i.descripcion"));
				vo.setEstado(rs.getString("i.estado"));
				vo.setArchivo(rs.getString("i.archivo"));
				vo.setFecha(rs.getDate("i.fecha"));
				vo.setKey1(rs.getString("i.key1"));
				vo.setKey2(rs.getString("i.key2"));
				vo.setKey3(rs.getString("i.key3"));
				vo.setKey4(rs.getString("i.key4"));
				Usuario asesor= new Usuario();
				asesor.setId(rs.getInt("asesor"));
				vo.setAsesor(asesor);
				Usuario estudiante= new Usuario();
				estudiante.setNombres(rs.getString("u.nombres"));
				estudiante.setApellidoPaterno(rs.getString("u.apellido_paterno"));
				estudiante.setApellidoMaterno(rs.getString("u.apellido_materno"));
				vo.setEstudiante(estudiante);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Boolean evaluarAprobado(Integer idIdea,String estado,Integer idAsesor) throws DAOExcepcion {
		String query = "update idea set estado=?,asesor=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, estado);
			stmt.setInt(2, idAsesor);
			stmt.setInt(3, idIdea);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return true;
	}

	public Boolean evaluarRechazado(Integer idIdea,String estado) throws DAOExcepcion {
		String query = "update idea set estado=?,asesor=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, estado);
			stmt.setInt(2, idIdea);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return true;
	}

	//Crear Idea 
	
	
	public Idea crear(Idea vo) throws DAOExcepcion {
		String query = "insert into idea(titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, usuario_id) values (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEstado());
			stmt.setString(4, vo.getArchivo());			
			stmt.setTimestamp(5, new Timestamp((new Date()).getTime()));
			stmt.setString(6, vo.getKey1());
			stmt.setString(7, vo.getKey2());
			stmt.setString(8, vo.getKey3());
			stmt.setString(9, vo.getKey4());
			stmt.setInt(10, vo.getEstudiante().getId());
								
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setId(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	
	//Modificar Idea
	public Idea modificar(Idea vo) throws DAOExcepcion {
		String query = "update idea set titulo=?,descripcion=?,estado=?,archivo=?,fecha=?,key1=?,key2=?,key3=?,key4=?, usuario_id=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEstado());
			stmt.setString(4, vo.getArchivo());
			stmt.setTimestamp(5, new Timestamp((new Date()).getTime()));
			stmt.setString(6, vo.getKey1());
			stmt.setString(7, vo.getKey2());
			stmt.setString(8, vo.getKey3());
			stmt.setString(9, vo.getKey4());
			stmt.setInt(10, vo.getEstudiante().getId());
			int i = stmt.executeUpdate();
			
			
			
			if (i != 1) {
				throw new SQLException("No se pudo modificar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	//publicar idea
	public Idea publicar(Idea vo) throws DAOExcepcion {
		String query = "update idea set titulo=?,descripcion=?,estado=?,archivo=?,fecha=?,key1=?,key2=?,key3=?,key4=?, usuario_id=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEstado());
			stmt.setString(4, vo.getArchivo());
			stmt.setTimestamp(5, new Timestamp((new Date()).getTime()));
			stmt.setString(6, vo.getKey1());
			stmt.setString(7, vo.getKey2());
			stmt.setString(8, vo.getKey3());
			stmt.setString(9, vo.getKey4());
			stmt.setInt(10, vo.getEstudiante().getId());
			
			int i = stmt.executeUpdate();
			
			
			
			if (i != 1) {
				throw new SQLException("No se pudo publicar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	
	public Idea obtener(String titulo) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where titulo=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, titulo);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Idea obtenerKey1(String key1) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where key1=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, key1);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Idea obtenerKey2(String key2) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where key2=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, key2);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Idea obtenerKey3(String key3) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where key3=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, key3);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Idea obtenerKey4(String key4) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where key4=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, key4);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Idea obtenerDocente(Integer docenteId) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, docente from idea where docente=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, docenteId);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				Usuario docenteObject = new Usuario();
				docenteObject.setId(rs.getInt(10));
				vo.setAsesor(docenteObject);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Idea obtenerEstudiante(Integer estudianteId) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, estudiante from idea where estudiante=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, estudianteId);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				Usuario estudianteObject = new Usuario();
				estudianteObject.setId(rs.getInt(10));
				vo.setAsesor(estudianteObject);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	
	
	public Collection<Idea> listar() throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4 from idea order by titulo";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {				
				Idea vo = new Idea();
				vo.setId(rs.getInt("id"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setArchivo(rs.getString("archivo"));
				vo.setFecha(rs.getDate("fecha"));
				vo.setKey1(rs.getString("key1"));
				vo.setKey2(rs.getString("key2"));
				vo.setKey3(rs.getString("key3"));
				vo.setKey4(rs.getString("key4"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	
	public Collection<Idea> listar(String titulo,String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4 from idea where titulo like ?";
			
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%"+titulo+"%");
			
			if (estado!=null && !estado.equals("") ) {
				query += " and estado=?";
				stmt.setString(2, "%"+estado+"%");
			}
			
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setId(rs.getInt("id"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setArchivo(rs.getString("archivo"));
				vo.setFecha(rs.getDate("fecha"));
				vo.setKey1(rs.getString("key1"));
				vo.setKey2(rs.getString("key2"));
				vo.setKey3(rs.getString("key3"));
				vo.setKey4(rs.getString("key4"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	

}